package smallfrench.moteur.biblio.igu;

import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.SwingUtilities;

import smallfrench.moteur.biblio.AClasse;
import smallfrench.moteur.biblio.AObjet;
import smallfrench.moteur.biblio.AnnotationMembre;
import smallfrench.moteur.biblio.RBooleen;
import smallfrench.moteur.biblio.RChaine;
import smallfrench.moteur.biblio.RCouleur;
import smallfrench.moteur.biblio.REntier;
import smallfrench.moteur.biblio.RFonctionScript;
import smallfrench.moteur.interp.ProcessusScript;

public class Composant extends AObjet {

	public static final AClasse CLASSE = AClasse.creer(Composant.class);

	protected Container component;

	private ArrayList<RFonctionScript> ecouteursClics;

	protected ProcessusScript processusScript;

	@AnnotationMembre
	public Composant() {
		ecouteursClics = new ArrayList<RFonctionScript>();
		processusScript = ProcessusScript.getInstance();
	}

	public Container getComponent() {
		return component;
	}

	public void setComponent(Container component) {
		this.component = component;

		component.addMouseListener(new MouseListener() {
			@Override
			public void mouseReleased(MouseEvent e) {

			}

			@Override
			public void mousePressed(MouseEvent e) {

			}

			@Override
			public void mouseExited(MouseEvent e) {

			}

			@Override
			public void mouseEntered(MouseEvent e) {

			}

			@Override
			public void mouseClicked(MouseEvent e) {

				EvenementSouris es = new EvenementSouris(
						e.getX(), e.getY(),
						e.getXOnScreen(), e.getYOnScreen(),
						e.getButton()
						);

				EvenementSouris[] params = {es};

				for (RFonctionScript i : ecouteursClics) {
					processusScript.ajouterEvenement(i, params);
				}
			}
		});
	}

	//---------------------------------------------------------------- Enfants

	@AnnotationMembre
	public void ajouter(Composant composant, RChaine contraintes) {
		component.add(composant.getComponent(), contraintes.valeur);
	}

	@AnnotationMembre
	public void retirer(Composant composant) {
		component.remove(composant.getComponent());
	}

	//-------------------------------------------------------------- Ecouteurs

	@AnnotationMembre
	public void ajouterEcouteurClic(RFonctionScript i) {
		ecouteursClics.add(i);
	}

	@AnnotationMembre
	public void modifierArrierePlan(RCouleur couleur) {
		component.setBackground(couleur.valeur);
	}

	//----------------------------------------------------------------- Taille

	@AnnotationMembre
	public void modifierTaille(REntier x, REntier y) {
		component.setSize(x.getValeurInt(), y.getValeurInt());
		SwingUtilities.updateComponentTreeUI(component);
	}

	@AnnotationMembre
	public void modifierTailleMin(Dimension dimension) {
		component.setMinimumSize(dimension.getValeur());
		SwingUtilities.updateComponentTreeUI(component);
	}

	@AnnotationMembre
	public void modifierTailleMax(Dimension dimension) {
		component.setMaximumSize(dimension.getValeur());
		SwingUtilities.updateComponentTreeUI(component);
	}

	@AnnotationMembre
	public Dimension obtenirTailleMin() {
		return new Dimension(component.getMinimumSize());
	}

	@AnnotationMembre
	public Dimension obtenirTaille() {
		return new Dimension(component.getSize());
	}

	@AnnotationMembre
	public Dimension obtenirTailleMax() {
		return new Dimension(component.getMaximumSize());
	}

	@AnnotationMembre
	public RBooleen estVisible() {
		return RBooleen.nouveau(component.isVisible());
	}

	@AnnotationMembre
	public void modifierVisible(RBooleen b) {
		component.setVisible(false);
	}

	//-----------------------------------------------------------------

	@AnnotationMembre
	public void modifierDisposition(Disposition d) {
		component.setLayout(d.getLayoutManager());
		SwingUtilities.updateComponentTreeUI(component);
	}

	@Override
	@AnnotationMembre
	public RChaine enChaine() {
		return new RChaine("Composant");
	}

}
